<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>日期/时间输入解析</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="datetime-appendix.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="datetime-appendix.html">快退</a></td><td width="60%" align="center" valign="bottom">附录B. 日期/时间支持</td><td width="10%" align="right" valign="top"><a href="datetime-appendix.html">快进</a></td><td width="10%" align="right" valign="top"><a href="datetime-keywords.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="AEN71115">B.1. 日期/时间输入解析</a></h1>
<p>日期/时间类型输入都是使用下列过程进行解码的。</p>
<div class="PROCEDURE">
<ol type="1">
<li class="STEP"><p>把输入字符串分解为一个个记号，然后把每个记号分成字符串、时间、时区、数字几类：</p>
<ol class="SUBSTEPS" type="a">
<li class="STEP"><p>如果一个数字记号包含一个冒号(<tt class="LITERAL">:</tt>)，那么这是一个时间字符串。包括随后所有的数据位和冒号。</p></li>
<li class="STEP"><p>如果这个数字记号包含一个划线(<tt class="LITERAL">-</tt>)、斜杠(<tt class="LITERAL">/</tt>)、多个点(<tt class="LITERAL">.</tt>)，那么它就是一个日期字符串，可能有一个文本月份。如果一个日期记号已经看过，那么将被解析为时区名(比如 <tt class="LITERAL">America/New_York</tt>)。</p></li>
<li class="STEP"><p>如果这个记号只是数字，那么它要么是一个单独的字段，要么是一个 ISO8601 连接的日期(比如 <tt class="LITERAL">19990113</tt> 是 1999 年 1 月 13 日)或者是连接的时间(比如 <tt class="LITERAL">141516</tt> 是 14:15:16)。</p></li>
<li class="STEP"><p>如果记号以一个加号(<tt class="LITERAL">+</tt>)或减号(<tt class="LITERAL">-</tt>)开头，那么它要么是一个时区，要么就是一个特殊的字段。</p></li>
</ol></li>
<li class="STEP"><p>如果记号是一个文本字符串，那么和可能的字符串进行匹配：</p>
<ol class="SUBSTEPS" type="a">
<li class="STEP"><p>把这个记号当作时区缩写进行二分查找。</p></li>
<li class="STEP"><p>如果没有找到，再做一次二分表查找，看看这个记号是特殊字符串(比如 <tt class="LITERAL">today</tt>)、日期(比如 <tt class="LITERAL">Thursday</tt>)、月份(比如 <tt class="LITERAL">January</tt>)，还是一个无关痛痒的字(比如 <tt class="LITERAL">at</tt>, <tt class="LITERAL">on</tt>)。</p></li>
<li class="STEP"><p>如果还没有找到，抛出一个错误。</p></li>
</ol></li>
<li class="STEP"><p>如果记号是一个数字或者数字字段：</p>
<ol class="SUBSTEPS" type="a">
<li class="STEP"><p>如果有八位或者六位数字，而且前面也没有读到其它日期字段，那么就解释成一个"连接的日期"(比如 <tt class="LITERAL">19990118</tt> 或 <tt class="LITERAL">990118</tt>)。这里的解析是 <tt class="LITERAL">YYYYMMDD</tt> 或 <tt class="LITERAL">YYMMDD</tt> 。</p></li>
<li class="STEP"><p>如果记号是三位数字，并且已经解码了一个年份，那么解释成年日。</p></li>
<li class="STEP"><p>如果已经读取了四和六位数字，并且已经读取了一个年份，那么就解析成时间(<tt class="LITERAL">HHMM</tt> 或 <tt class="LITERAL">HHMMSS</tt>)。</p></li>
<li class="STEP"><p>如果是三位或更多位并且还没有找到日期字段，则解析成一个年份(这个解析强制剩余的日期字段的顺序为 yy-mm-dd)。</p></li>
<li class="STEP"><p>那么解析成某一天。否则，日期字段的顺序被认为是尊循 <tt class="VARNAME">DateStyle</tt> 设置：mm-dd-yy, dd-mm-yy, yy-mm-dd 之一。如果发现月份或者日期字段超出范围，则抛出一个错误。</p></li>
</ol></li>
<li class="STEP"><p>如果声明了 BC 则对年份取其负数并加一，用于内部保存。因为在格里高利历法里没有零年，所以数字上的 1BC 是公元零年。</p></li>
<li class="STEP"><p>如果没有声明 BC 并且年份字段有两个数据位的长度，那么把年份调整为 4 位。如果该字段小于 70 那么加 2000 ；否则加 1900 。
<div class="TIP">
<blockquote class="TIP">
<p><b>【提示】</b>格里高利年份 AD 1-99 可以用前导零的方式使用 4 位数字(也就是说 <tt class="LITERAL">0099</tt> 是 AD 99)。</p>
</blockquote>
</div></P></li>
</ol>
</div>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="datetime-appendix.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="datetime-keywords.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">日期/时间支持</td><td width="34%" align="center" valign="top"><a href="datetime-appendix.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">日期/时间关键字</td></tr>
</table>
</div>
</body></html>